<?php

/**
 * @Author: tianwangchong
 * @Date:   2018-06-04 18:39:09
 * @Last Modified by:   tianwangchong
 * @Last Modified time: 2018-06-05 11:14:49
 */

namespace App\Classes\WechatRobot;

use Hanson\Vbot\Foundation\Vbot as Bot;
use Vbot\Blacklist\Blacklist;
use Vbot\GuessNumber\GuessNumber;

class WechatRobot
{
    private $config;

    public function __construct($session = 'wechat-robot')
    {
        $this->config = config('wechat-robot');

        if ($session) {
            $this->config['session'] = $session;
        }
    }

    public function run()
    {
        $robot = new Bot($this->config);

        /**
         * 消息处理器
         */
        // 收到消息时触发
        $robot->messageHandler->setHandler([MessageHandler::class, 'messageHandler']);

        // 一直触发, setCustomHandler 为当 Vbot 向微信服务器请求查询是否有最新消息时，无论是否有新消息都会触发，触发周期最长为 35 秒一次。
        // $messageHandler->setCustomHandler(function(){
        //     if (date('H') == 12) {
        //         Text::send('filehelper', '12 点');
        //     }
        // });

        /**
         * 消息扩展
         */
        $robot->messageExtension->load([
            // some extensions
            Blacklist::class,
            GuessNumber::class,
            // HotGirl::class,
        ]);

        /**
         * 监听器
         */
        // 二维码监听器。在登录时会出现二维码需要扫码登录。而这个二维码链接也将传到二维码监听器中。
        $robot->observer->setQrCodeObserver([Observer::class, 'setQrCodeObserver']);

        // 登录成功监听器。登录成功时回调。无论是第一次登录还是免扫码登录均会触发。
        $robot->observer->setLoginSuccessObserver([Observer::class, 'setLoginSuccessObserver']);

        // 免扫码成功监听器。免扫码登录成功时回调。
        $robot->observer->setReLoginSuccessObserver([Observer::class, 'setReLoginSuccessObserver']);

        // 程序退出监听器。程序退出监听器。
        $robot->observer->setExitObserver([Observer::class, 'setExitObserver']);

        // 好友监听器。此回调仅在初始化好友时执行。变量 $contacts 含有数组下表 ‘friends’,’groups’,’officials’,’special’,’members’
        $robot->observer->setFetchContactObserver([Observer::class, 'setFetchContactObserver']);

        // 消息处理前监听器。接收消息前回调。
        $robot->observer->setBeforeMessageObserver([Observer::class, 'setBeforeMessageObserver']);

        // 异常监听器。当接收消息异常时，当系统判断为太久没从手机端打开微信时，则急需打开，时间过久将断开。
        $robot->observer->setNeedActivateObserver([Observer::class, 'setNeedActivateObserver']);

        $robot->server->serve();
    }
}
